#!/bin/bash

# =============================================================================
# Admin服务脚本安装脚本
# 作者: AI Assistant
# 创建时间: $(date +%Y-%m-%d)
# 功能: 自动安装和配置所有管理脚本
# =============================================================================

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 打印分隔线
print_separator() {
    echo -e "${CYAN}========================================${NC}"
}

# 检查系统环境
check_environment() {
    log_info "检查系统环境..."
    
    # 检查操作系统
    if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        log_info "操作系统: Linux"
    else
        log_error "此脚本仅支持Linux系统"
        exit 1
    fi
    
    # 检查Bash版本
    BASH_VERSION=$(bash --version | head -n1 | cut -d' ' -f4 | cut -d'.' -f1)
    if [ "$BASH_VERSION" -ge 4 ]; then
        log_info "Bash版本: $(bash --version | head -n1 | cut -d' ' -f4)"
    else
        log_warn "Bash版本较低，建议使用Bash 4.0+"
    fi
    
    # 检查Java环境
    if command -v java &> /dev/null; then
        JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2)
        log_info "Java版本: $JAVA_VERSION"
    else
        log_warn "Java未安装或不在PATH中，请先安装Java 17+"
    fi
    
    # 检查必要工具
    local tools=("ps" "netstat" "tail" "grep" "awk" "sed")
    for tool in "${tools[@]}"; do
        if command -v "$tool" &> /dev/null; then
            log_info "工具检查: $tool ✓"
        else
            log_warn "工具缺失: $tool"
        fi
    done
}

# 创建目标目录
create_directories() {
    log_info "创建目标目录..."
    
    # 默认安装目录
    DEFAULT_INSTALL_DIR="/usr/local/bin"
    DEFAULT_CONFIG_DIR="/etc/admin-service"
    
    read -p "请输入安装目录 [$DEFAULT_INSTALL_DIR]: " INSTALL_DIR
    INSTALL_DIR=${INSTALL_DIR:-$DEFAULT_INSTALL_DIR}
    
    read -p "请输入配置目录 [$DEFAULT_CONFIG_DIR]: " CONFIG_DIR
    CONFIG_DIR=${CONFIG_DIR:-$DEFAULT_CONFIG_DIR}
    
    # 创建目录
    mkdir -p "$INSTALL_DIR"
    mkdir -p "$CONFIG_DIR"
    
    log_info "安装目录: $INSTALL_DIR"
    log_info "配置目录: $CONFIG_DIR"
}

# 安装脚本文件
install_scripts() {
    log_info "安装脚本文件..."
    
    # 脚本文件列表
    local scripts=(
        "start-admin.sh"
        "stop-admin.sh"
        "restart-admin.sh"
        "status-admin.sh"
        "admin-service.sh"
    )
    
    # 获取当前脚本所在目录
    local current_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
    
    for script in "${scripts[@]}"; do
        local source_file="$current_dir/$script"
        local target_file="$INSTALL_DIR/$script"
        
        if [ -f "$source_file" ]; then
            cp "$source_file" "$target_file"
            chmod +x "$target_file"
            log_info "已安装: $script"
        else
            log_warn "脚本文件不存在: $script"
        fi
    done
    
    # 创建软链接
    ln -sf "$INSTALL_DIR/admin-service.sh" "$INSTALL_DIR/admin"
    log_info "已创建软链接: admin -> admin-service.sh"
}

# 创建配置文件
create_config() {
    log_info "创建配置文件..."
    
    local config_file="$CONFIG_DIR/admin-service.conf"
    
    cat > "$config_file" << EOF
# Admin服务配置文件
# 生成时间: $(date '+%Y-%m-%d %H:%M:%S')

# JAR文件配置
JAR_FOLDER="/mydata/jars/yccloud17/admin"
JAR_NAME="admin-0.0.1-SNAPSHOT.jar"

# 日志配置
LOG_FILE="\${JAR_FOLDER}/admin.log"
PID_FILE="\${JAR_FOLDER}/admin.pid"

# 配置文件路径
APPLICATION_YML="\${JAR_FOLDER}/application.yml"

# JVM参数
JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError"

# 服务端口（用于状态检查）
SERVICE_PORT=8080

# 超时设置
START_TIMEOUT=60
STOP_TIMEOUT=30
EOF
    
    log_info "配置文件已创建: $config_file"
}

# 创建systemd服务文件
create_systemd_service() {
    log_info "创建systemd服务文件..."
    
    local service_file="/etc/systemd/system/admin.service"
    
    cat > "$service_file" << EOF
[Unit]
Description=Admin Service
After=network.target

[Service]
Type=forking
User=admin
Group=admin
WorkingDirectory=/mydata/jars/yccloud17/admin
ExecStart=/usr/local/bin/admin-service.sh start
ExecStop=/usr/local/bin/admin-service.sh stop
ExecReload=/usr/local/bin/admin-service.sh restart
PIDFile=/mydata/jars/yccloud17/admin/admin.pid
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF
    
    log_info "systemd服务文件已创建: $service_file"
    log_warn "注意: 请根据实际情况修改用户、组和路径配置"
}

# 创建用户和组
create_user_group() {
    log_info "创建系统用户和组..."
    
    # 检查是否已存在
    if id "admin" &>/dev/null; then
        log_info "用户 'admin' 已存在"
    else
        # 创建组
        if ! getent group admin > /dev/null 2>&1; then
            groupadd admin
            log_info "已创建组: admin"
        fi
        
        # 创建用户
        useradd -r -g admin -s /bin/bash -d /home/admin admin
        log_info "已创建用户: admin"
        
        # 创建主目录
        mkdir -p /home/admin
        chown admin:admin /home/admin
        chmod 755 /home/admin
    fi
}

# 设置环境变量
setup_environment() {
    log_info "设置环境变量..."
    
    local profile_file="/etc/profile.d/admin-service.sh"
    
    cat > "$profile_file" << EOF
# Admin服务环境变量
export ADMIN_SERVICE_HOME="$CONFIG_DIR"
export PATH="\$PATH:$INSTALL_DIR"

# 别名设置
alias admin-start='admin-service.sh start'
alias admin-stop='admin-service.sh stop'
alias admin-restart='admin-service.sh restart'
alias admin-status='admin-service.sh status'
alias admin-logs='admin-service.sh logs'
EOF
    
    log_info "环境变量文件已创建: $profile_file"
    log_info "请执行 'source $profile_file' 或重新登录以生效"
}

# 创建示例部署脚本
create_deploy_script() {
    log_info "创建部署脚本..."
    
    local deploy_script="$CONFIG_DIR/deploy.sh"
    
    cat > "$deploy_script" << 'EOF'
#!/bin/bash

# Admin服务部署脚本
# 使用方法: ./deploy.sh [JAR文件路径]

JAR_FILE="${1:-admin-0.0.1-SNAPSHOT.jar}"
TARGET_DIR="/mydata/jars/yccloud17/admin"

echo "开始部署Admin服务..."

# 创建目标目录
mkdir -p "$TARGET_DIR"

# 复制JAR文件
if [ -f "$JAR_FILE" ]; then
    cp "$JAR_FILE" "$TARGET_DIR/"
    echo "JAR文件已复制到: $TARGET_DIR"
else
    echo "错误: JAR文件不存在: $JAR_FILE"
    exit 1
fi

# 复制配置文件（如果存在）
if [ -f "application.yml" ]; then
    cp "application.yml" "$TARGET_DIR/"
    echo "配置文件已复制到: $TARGET_DIR"
fi

# 设置权限
chown -R admin:admin "$TARGET_DIR"
chmod -R 755 "$TARGET_DIR"

echo "部署完成！"
echo "使用以下命令管理服务:"
echo "  admin-service.sh start    # 启动服务"
echo "  admin-service.sh status   # 查看状态"
echo "  admin-service.sh stop     # 停止服务"
EOF
    
    chmod +x "$deploy_script"
    log_info "部署脚本已创建: $deploy_script"
}

# 显示安装完成信息
show_completion() {
    print_separator
    echo -e "${CYAN}安装完成！${NC}"
    print_separator
    
    echo -e "${GREEN}已安装的文件:${NC}"
    echo "  脚本文件: $INSTALL_DIR/"
    echo "  配置文件: $CONFIG_DIR/"
    echo "  软链接: admin -> admin-service.sh"
    
    echo -e "${GREEN}使用方法:${NC}"
    echo "  启动服务: admin start"
    echo "  停止服务: admin stop"
    echo "  重启服务: admin restart"
    echo "  查看状态: admin status"
    echo "  查看日志: admin logs"
    echo "  显示帮助: admin help"
    
    echo -e "${GREEN}下一步操作:${NC}"
    echo "  1. 部署JAR文件到: /mydata/jars/yccloud17/admin/"
    echo "  2. 配置application.yml文件"
    echo "  3. 执行: source /etc/profile.d/admin-service.sh"
    echo "  4. 测试服务: admin status"
    
    echo -e "${YELLOW}注意事项:${NC}"
    echo "  - 请根据实际情况修改配置文件中的路径"
    echo "  - 确保Java 17+已正确安装"
    echo "  - 检查防火墙和端口配置"
    
    print_separator
}

# 主函数
main() {
    print_separator
    echo -e "${CYAN}Admin服务脚本安装程序${NC}"
    echo -e "${CYAN}版本: 1.0${NC}"
    print_separator
    
    # 检查是否为root用户
    if [ "$EUID" -ne 0 ]; then
        log_error "请使用root用户运行此安装脚本"
        exit 1
    fi
    
    # 执行安装步骤
    check_environment
    create_directories
    install_scripts
    create_config
    create_user_group
    create_systemd_service
    setup_environment
    create_deploy_script
    show_completion
    
    log_info "安装程序执行完成！"
}

# 执行主函数
main "$@"


